package main

import "fmt"

func main() {

	// map初始化
	// 使用复合字面值初始化 map 类型变量
	m1 := map[int][]string{
		1: []string{"v01", "v02"},
		3: []string{"v03", "v04"},
		5: []string{"v05", "v06"},
	}

	fmt.Println(m1)

	m2 := map[int][]string{
		1: {"v01_2", "v02_2"},
		3: {"v03_2", "v04_2"},
		5: {"v05_2", "v06_2"},
	}

	fmt.Println(m2)

	m3 := map[Position]string{
		Position{1.0, 3.0}: "school",
		Position{2.0, 4.0}: "school-mall",
		Position{5.0, 6.0}: "home",
		Position{7.0, 8.0}: "hospital",
	}
	fmt.Println(m3)

	// 使用 make 为 map 类型变量进行显式初始化
	//  未指定初始容量
	m4 := make(map[int]string)
	fmt.Println(m4)

	// 指定初始容量为8
	m5 := make(map[int]string, 8)
	fmt.Println(m5)

	// 声明一个map
	var countryCapitalMap map[string]string
	/* 创建集合 */
	countryCapitalMap = make(map[string]string)

	countryCapitalMap["France"] = "Paris"
	countryCapitalMap["China"] = "Beijing"
	countryCapitalMap["Japan"] = "Tokyo"

	// 根据map的key遍历
	for country := range countryCapitalMap {
		fmt.Println("Capital of", country, "is", countryCapitalMap[country])
	}

	// 根据k v一起遍历
	for k, v := range countryCapitalMap {
		fmt.Println("Capital of", k, "is", v)
	}

	// 判断元素是否存在
	capital, ok := countryCapitalMap["USA"]
	if ok {
		fmt.Println("Capital of USA is", capital)
	} else {
		fmt.Println("Capital of USA is not present")
	}

	// map len
	fmt.Printf("countryCapitalMap length is %d \n", len(countryCapitalMap))

	// map 删除
	fmt.Println("原始 map")

	/* 打印 map */
	for country := range countryCapitalMap {
		fmt.Println("Capital of", country, "is", countryCapitalMap[country])
	}

	/* 删除元素 */
	delete(countryCapitalMap, "Japan")
	fmt.Println("Entry for Japan is deleted")

	fmt.Println("删除元素后 map")

	/* 打印 map */
	for country := range countryCapitalMap {
		fmt.Println("Capital of", country, "is", countryCapitalMap[country])
	}

	// 可以使用ok-idiom获取值，可知道key/value是否存在
	// value, ok := map[key]
	m := make(map[string]int)
	m["a"] = 1
	x, ok := m["b"]
	fmt.Println(x, ok)
	x, ok = m["a"]
	fmt.Println(x, ok)

	// 与切片相似，映射是引用类型。当将映射分配给一个新变量时，它们都指向相同的内部数据结构
	personSalary := map[string]int{
		"steve": 12000,
		"jamie": 15000,
	}
	personSalary["mike"] = 9000
	fmt.Println("Original person salary", personSalary)
	newPersonSalary := personSalary
	newPersonSalary["mike"] = 18000
	fmt.Println("Person salary changed", personSalary)

	// map 的基本操作
	// 插入新键值对
	m6 := make(map[int]string)
	m6[1] = "v01"
	m6[2] = "v02"

	// 获取键值对数量
	fmt.Println(len(m6))

	// 查找和数据读取
	v := m6[1]
	fmt.Println("m6.key.1: " + v)

	// 通过了一个布尔类型变量 ok，来判断键“1”是否存在于 map 中。如果存在，变量 v 就会被正确地赋值为键“1”对应的 value。
	// 在 Go 语言中，请使用“comma ok”惯用法对 map 进行键查找和键值读取操作。
	v01, ok := m6[1]
	if !ok {
		fmt.Println("m6.not.exist.the key 1")
	} else {
		fmt.Println("m6.key.1: " + v01)
	}
	// 删除数据
	delete(m6, 1)
	fmt.Printf("after delete the map : %v", m6)

}

type Position struct {
	x float64
	y float64
}
